home *** CD-ROM | disk | FTP | other *** search
/ The Very Best of Atari Inside / The Very Best of Atari Inside 1.iso / sharew / accs / ramdisk3 / ramdisk.c < prev   
Encoding:
C/C++ Source or Header  |  1986-02-06  |  4.4 KB  |  154 lines

  1. #include "portab.h"
  2. #include "obdefs.h"
  3. #include "define.h"
  4. #include "gemdefs.h"
  5. #include "osbind.h"
  6.  
  7. struct bpb             /* siehe auch BIOS:rwabs.c fuer weitere Informationen */
  8. {
  9.    WORD  recsiz,
  10.          clsiz,
  11.          clsizb,
  12.          rdlen,
  13.          fsiz,
  14.          fatrec,
  15.          datrec,
  16.          numcl,
  17.          bflags;
  18. };
  19.  
  20. int contrl[12];        /* AES Kontroll Felder                                */
  21. int intin[128];
  22. int ptsin[128];
  23. int intout[128];
  24. int ptsout[128];
  25.  
  26. typedef LONG (*PFL)();  /* Zeiger auf Funktion, die ein lang-Adresse liefer */
  27. typedef WORD (*PFW)();  /* Zeiger auf Funktion, die ein Wort liefert        */
  28.  
  29. PFL getbpb;             /* Zeiger auf die Originalfunktion getbpb           */
  30. PFW mediach;            /* Zeiger auf die Originalfunktion mediach          */
  31. PFL rwabs;              /* Zeiger auf die Originalfunktion rwabs            */
  32.  
  33. struct bpb rdiskbpb = { 512,2,1024,7,5,6,18,351,0 };   
  34.                         /* gleiche Struktur wie bei 3,5 Zoll SSDD Disketten */
  35.  
  36. int data[184320];       /* gleiche groesse des Speicherplatzes wie 3,5 SSDD */
  37.  
  38.  
  39.                         /* Daten fuer die ersten beiden Tracks der Diskette */
  40. int fdata[0x50]={
  41.       0x0000,0x4e4e,0x4e4e,0x4e4e,0xe1d1,0x2300,0x0202,0x0100,
  42.       0x0270,0x00d0,0x02f8,0x0500,0x0900,0x0100,0x0000,0x4e4e,
  43.       0x4e4e,0x4e4e,0x4e4e,0x4e4e,0x4e4e,0x4e4e,0x4e4e,0x4e4e,
  44.       0x4e4e,0x4e4e,0x4e4e,0x4e4e,0x4e4e,0x4e4e,0x0000,0x0000,
  45.       0x0000,0x0000,0x0000,0x0000,0xf5f5,0xf5fe,0x4f00,0x0102,
  46.       0xf74e,0x4e4e,0x4e4e,0x4e4e,0x4e4e,0x4e4e,0x4e4e,0x4e4e,
  47.       0x4e4e,0x4e4e,0x4e4e,0x4e00,0x0000,0x0000,0x0000,0x0000,
  48.       0x0000,0x00f5,0xf5f5,0xfbe5,0xe5e5,0xe5e5,0xe5e5,0xe5e5,
  49.       0x5241,0x4d2d,0x4449,0x534b,0x3532,0x3008,0x0000,0x0000,
  50.       0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000 };
  51.  
  52. LONG RDgetbpb(dev)              /* neue RAM DISK getbpb Funktion */
  53. WORD dev;
  54. {
  55.    if(dev != 3)
  56.       return((*getbpb)(dev));   /* fals nicht RAM DISK           */
  57.    else
  58.       return(&rdiskbpb);        /* fals RAM DISK                 */
  59. }
  60.  
  61. WORD RDmediach(dev)             /* neue RAM DISK mediach Funktion */
  62. WORD dev;
  63. {
  64.    if(dev != 3)
  65.       return((*mediach)(dev));  /* fals nicht RAM DISK            */
  66.    else
  67.       return(0);                /*   RAM DISK aendert Disk nicht    */
  68. }
  69.  
  70. LONG RDrwabs(rw,buf,count,recno,dev)  /* neue RAM DISK rwabs Funktion  */
  71. WORD rw;
  72. int *buf;
  73. WORD count,recno,dev;
  74. {
  75.    int i;
  76.    int *p;
  77.  
  78.    if (dev != 3)
  79.       return((*rwabs)(rw,buf,count,recno,dev)); /* fals nicht RAM DISK  */
  80.    else
  81.       {
  82.       if (rw > 1)                     /* RAM DISK wird nicht gewechselt */
  83.          rw -=2;
  84.       while(count>0)
  85.          {
  86.          p = &data[((long) recno) * 256l];
  87.          if(rw==0)
  88.             for(i=0;i<256;i++)
  89.                *buf++ = *p++;
  90.          else
  91.             for(i=0;i<256;i++)
  92.                *p++ = *buf++;
  93.          count--;
  94.          recno++;
  95.          }
  96.       return(0l);
  97.       }
  98. }
  99.  
  100. install()
  101. {
  102.    long *bpbvect = 0x472;
  103.    long *rwvect  = 0x476;
  104.    long *mcvect  = 0x47e;
  105.    long *devset  = 0x4c2;
  106.  
  107.    getbpb   = (PFL) *bpbvect;   /* speichere alte Vektoren   */
  108.    mediach  = (PFW) *mcvect;    
  109.    rwabs    = (PFL) *rwvect;
  110.  
  111.    *bpbvect = RDgetbpb;         /* installiere neue Vektoren */
  112.    *mcvect  = RDmediach;
  113.    *rwvect  = RDrwabs;
  114.                                
  115.    *devset = (*devset) | (0x08l);
  116. }
  117.  
  118. sleep()
  119. {
  120.    int i;
  121.  
  122.    while (1)
  123.       {
  124.       i=evnt_timer(60000,0);        /* warte 60 sec ueber Timer  */
  125.       Bconout(2,7);                 /* Beep als Lebenszeichen    */
  126.       }
  127. }
  128.  
  129. main()
  130. {
  131.    appl_init();                      /* AES init fuer AES Routinen */
  132.  
  133.    format();                         /* 'Formatiere' RAM DISK      */
  134.  
  135.    xbios(38,install);                /* Installiere Vektoren in SP Mode */
  136.    sleep();                          /* Accessories enden niemals       */
  137. }
  138.  
  139. format()
  140. {
  141.    long i;
  142.  
  143.    for(i=0;i<0x100;data[i++]=0xe5e5);       /* loesche RAM DISK          */
  144.    for(i=0;i<0x40l;data[i]=fdata[i++]);      /* schreibe ersten Track     */
  145.    data[0xffl]=0x2F72;
  146.    for(i=0x0100;i<0x1200l;data[i++]=0x0000);
  147.    data[0x0100l]=0xf7ff;
  148.    data[0x0101l]=0xff00;
  149.    data[0x0600l]=0xf7ff;
  150.    data[0x0601l]=0xff00;
  151.    for(i=0;i<0x10l;i++)                      /* schreibe zweiten Track    */
  152.       data[0x0b00l+i]=fdata[0x40l+i];
  153. }
  154.